gl renderer: Fix inset and outset shadows in hidpi
authorTimm Bäder <mail@baedert.org>
Sat, 9 Dec 2017 08:41:52 +0000 (09:41 +0100)
committerTimm Bäder <mail@baedert.org>
Thu, 21 Dec 2017 18:12:32 +0000 (19:12 +0100)
gsk/gl/gskglrenderer.c

index 42c8ce839f09ea864d3f00abe54ecf1573543968..f2a3fee1fd9c070b994c9ca4c45d3c00183a013b 100644 (file)
@@ -91,26 +91,6 @@ get_gl_scaling_filters (GskRenderNode *node,
   *mag_filter_r = GL_LINEAR;
 }
 
-static inline void
-rounded_rect_to_floats (const GskRoundedRect *rect,
-                        float                *outline,
-                        float                *corner_widths,
-                        float                *corner_heights)
-{
-  int i;
-
-  outline[0] = rect->bounds.origin.x;
-  outline[1] = rect->bounds.origin.y;
-  outline[2] = rect->bounds.size.width;
-  outline[3] = rect->bounds.size.height;
-
-  for (i = 0; i < 4; i ++)
-    {
-      corner_widths[i] = rect->corner[i].width;
-      corner_heights[i] = rect->corner[i].height;
-    }
-}
-
 static inline void
 rgba_to_float (const GdkRGBA *c,
                float         *f)
@@ -271,6 +251,31 @@ rounded_rect_intersect (GskGLRenderer        *self,
     }
 }
 
+static inline void
+rounded_rect_to_floats (GskGLRenderer        *self,
+                        RenderOpBuilder      *builder,
+                        const GskRoundedRect *rect,
+                        float                *outline,
+                        float                *corner_widths,
+                        float                *corner_heights)
+{
+  int i;
+  graphene_rect_t transformed_bounds;
+
+  graphene_matrix_transform_bounds (&builder->current_modelview, &rect->bounds, &transformed_bounds);
+
+  outline[0] = transformed_bounds.origin.x;
+  outline[1] = transformed_bounds.origin.y;
+  outline[2] = transformed_bounds.size.width;
+  outline[3] = transformed_bounds.size.height;
+
+  for (i = 0; i < 4; i ++)
+    {
+      corner_widths[i] = rect->corner[i].width * self->scale_factor;
+      corner_heights[i] = rect->corner[i].height * self->scale_factor;
+    }
+}
+
 static inline void
 render_fallback_node (GskGLRenderer       *self,
                       GskRenderNode       *node,
@@ -835,14 +840,15 @@ render_inset_shadow_node (GskGLRenderer       *self,
 
   op.op = OP_CHANGE_INSET_SHADOW;
   rgba_to_float (gsk_inset_shadow_node_peek_color (node), op.inset_shadow.color);
-  rounded_rect_to_floats (gsk_inset_shadow_node_peek_outline (node),
+  rounded_rect_to_floats (self, builder,
+                          gsk_inset_shadow_node_peek_outline (node),
                           op.inset_shadow.outline,
                           op.inset_shadow.corner_widths,
                           op.inset_shadow.corner_heights);
-  op.inset_shadow.radius = gsk_inset_shadow_node_get_blur_radius (node);
-  op.inset_shadow.spread = gsk_inset_shadow_node_get_spread (node);
-  op.inset_shadow.offset[0] = gsk_inset_shadow_node_get_dx (node);
-  op.inset_shadow.offset[1] = -gsk_inset_shadow_node_get_dy (node);
+  op.inset_shadow.radius = gsk_inset_shadow_node_get_blur_radius (node) * self->scale_factor;
+  op.inset_shadow.spread = gsk_inset_shadow_node_get_spread (node) * self->scale_factor;
+  op.inset_shadow.offset[0] = gsk_inset_shadow_node_get_dx (node) * self->scale_factor;
+  op.inset_shadow.offset[1] = -gsk_inset_shadow_node_get_dy (node) * self->scale_factor;
 
   ops_set_program (builder, &self->inset_shadow_program);
   ops_add (builder, &op);
@@ -866,14 +872,15 @@ render_outset_shadow_node (GskGLRenderer       *self,
 
   op.op = OP_CHANGE_OUTSET_SHADOW;
   rgba_to_float (gsk_outset_shadow_node_peek_color (node), op.outset_shadow.color);
-  rounded_rect_to_floats (gsk_outset_shadow_node_peek_outline (node),
+  rounded_rect_to_floats (self, builder,
+                          gsk_outset_shadow_node_peek_outline (node),
                           op.outset_shadow.outline,
                           op.outset_shadow.corner_widths,
                           op.outset_shadow.corner_heights);
-  op.outset_shadow.radius = gsk_outset_shadow_node_get_blur_radius (node);
-  op.outset_shadow.spread = gsk_outset_shadow_node_get_spread (node);
-  op.outset_shadow.offset[0] = gsk_outset_shadow_node_get_dx (node);
-  op.outset_shadow.offset[1] = -gsk_outset_shadow_node_get_dy (node);
+  op.outset_shadow.radius = gsk_outset_shadow_node_get_blur_radius (node) * self->scale_factor;
+  op.outset_shadow.spread = gsk_outset_shadow_node_get_spread (node) * self->scale_factor;
+  op.outset_shadow.offset[0] = gsk_outset_shadow_node_get_dx (node) * self->scale_factor;
+  op.outset_shadow.offset[1] = -gsk_outset_shadow_node_get_dy (node) * self->scale_factor;
 
   ops_set_program (builder, &self->outset_shadow_program);
   ops_add (builder, &op);